package controlador;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import modelo.ComandaDao;

import entities.ComandaEntity;

import observer.ObserverRemotoREST;
import rmi.InterfazRemotaRest;
import service.AperturaMesaSrv;
import service.CajaSrv;
import service.ComandaSrv;
import service.FacturaSrv;
import service.MesaSrv;
import service.PedidoSrv;
import service.SucursalSrv;
import beans.AperturaMesaBean;
import beans.ComandaBean;
import beans.FacturaBean;
import beans.ItemCartaBean;
import beans.MesaBean;
import beans.MozoBean;
import beans.PedidoBean;
import beans.SectorBean;
import beans.SucursalBean;

public class Sistema extends UnicastRemoteObject implements InterfazRemotaRest {

	protected Sistema() throws RemoteException {
		super();
	}

	private static final long serialVersionUID = 1L;
	
	private static Sistema instancia;
	
	public static Sistema getInstancia(){
		if (instancia==null){
			try {
				instancia = new Sistema();
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		} 
		return instancia;
	}
	
	
	
	@Override
	public String hola(){
		String salida = "Hola mundo";
		return salida;
	}
	
	
	@Override
	public boolean abrirMesa(Integer cantComensales, List<MesaBean> mesas, MozoBean mozo, Integer idSucursal) throws RemoteException {
		AperturaMesaBean aperturaMesa = new AperturaMesaBean();
		aperturaMesa.setCantComensales(cantComensales);
		aperturaMesa.setEstado("ACTIVA");
		aperturaMesa.setFecha(new Date());
		for (MesaBean mesaBean : mesas) {
			mesaBean.setEstado("OCUPADA");
		}
		
		aperturaMesa.setMesas(mesas);
		aperturaMesa.setMozo(mozo);	
		
		return AperturaMesaSrv.getInstancia().guardarAperturaMesa(aperturaMesa, idSucursal);
	}


	@Override
	public List<MozoBean> obtenerMozos() throws RemoteException {
		Mozo m = new Mozo();
		List<MozoBean> listaMozos = new ArrayList<MozoBean>();
		listaMozos=m.obtenerMozos();
		return listaMozos;
	}


	
	/**
	 * 
	 * @param apertMesa
	 * @param idSucursal
	 */
	@Override
	public void liberarMesa (AperturaMesaBean apertMesa) throws RemoteException
	{
		for (MesaBean mesa : apertMesa.getMesas()) {
			mesa.setEstado("LIBRE");
		}
		apertMesa.setEstado("CERRADA");
		AperturaMesaSrv.getInstancia().modificarAperturaMesa(apertMesa);
		
	}

	/**
	 * 
	 */
	@Override
	public void cierreMesa(AperturaMesaBean apertMesa) throws RemoteException 
	{
   		for (MesaBean mesa : apertMesa.getMesas()) {
   			mesa.setEstado("ALIBERAR");
   		}
   		apertMesa.setEstado("ACERRAR");
   		AperturaMesaSrv.getInstancia().modificarAperturaMesa(apertMesa);
   		
   		      
       
	}

	/**
	 * 
	 */
	@Override
	public void registrarPedido(AperturaMesaBean apertMesa, List<PedidoBean> pedidos) throws RemoteException 
	{

		for (PedidoBean pedidoBean : apertMesa.getPedidos()) {
			for (PedidoBean pedidoAregistrar : pedidos) {
				if(pedidoAregistrar.getId().equals(pedidoBean.getId()))
				{
					pedidoBean.setEstado("TERMINADO");
				}	
			}
		}
		AperturaMesaSrv.getInstancia().modificarAperturaMesa(apertMesa);	
}
		
		
		
	

	@Override
	public void addObserverRemotoCPR(ObserverRemotoREST observer)
			throws RemoteException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void removeObserverRemotoCPR(ObserverRemotoREST observer)
			throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public MozoBean obtenerMozo(Integer idMozo)throws RemoteException {
		MozoBean mozoBean = new MozoBean();
		mozoBean = Mozo.getInstancia().obtenerMozo(idMozo);
		return mozoBean;
	}
	
	@Override
	public SucursalBean obtenerSucursal(Integer idSucursal) throws RemoteException {
		System.out.println("entrando al controller Sistema.\n");
		SucursalBean suc = new SucursalBean();
		suc = Sucursal.getInstancia().obtenerSucursal(idSucursal);
		return suc;
	}
	
	/**
	 * 
	 * @return
	 */
	
	public List<PedidoBean> obtenerPedidos() {
		List<PedidoBean> pedidos = new ArrayList<PedidoBean>();
		pedidos = PedidoSrv.getInstancia().obtenerPedidos();
		return pedidos;
	}
	
	/**
	 * 
	 * @param items
	 * @return
	 */
	public ComandaBean emitirComanda(List<ItemCartaBean> items) {
		ComandaBean comanda = new ComandaBean();
		
		return comanda;
	}
	
	/**
	 * 
	 * @param idSucursal
	 * @param apertMesa
	 * @param area
	 * @param itemsCarta
	 */
	@Override
	public void generarPedido (AperturaMesaBean apertMesa, List<ItemCartaBean> itemsCarta) throws RemoteException
	{
//		System.out.println("Ingreso a metodo generarPedido en Sistema\n");
//		System.out.println("Apertura de mesa"+apertMesa.getIdAperturaMesa());
//		System.out.println("ID aperturaMesa: "+apertMesa.getIdAperturaMesa());
		
		PedidoBean pedido = new PedidoBean();
		pedido.setEstado("AREALIZAR");
		
		List<ItemCartaBean> itemsCartaTemp = new ArrayList<ItemCartaBean>();

//		System.out.println("\nSistema itemsCarta ID: \n"+itemsCarta.get(0).getId());
//		System.out.println("\nSistema itemsCarta descrip Plato: \n"+itemsCarta.get(0).getPlato().getDescripcion());

		for (ItemCartaBean itemCartaBean : itemsCarta) {
			itemsCartaTemp.add(itemCartaBean);
			ComandaBean comanda = new ComandaBean();
			comanda.setEstado("AREALIZAR");
			comanda.setItem(itemCartaBean);
			ComandaSrv.getInstancia().guardarComanda(comanda);
			System.out.println("\nComanda Guardada\n");
		}
		
		pedido.setItems(itemsCarta);
		List<PedidoBean> pedidosBeanTemp = new ArrayList<PedidoBean>();
		for (PedidoBean pedidoBean : apertMesa.getPedidos()) {
			pedidosBeanTemp.add(pedidoBean);
			
			System.out.println("Agrega pedidoBean ID"+pedidoBean.getId());
			
		}
		
		pedidosBeanTemp.add(pedido);
		apertMesa.setPedidos(pedidosBeanTemp);
		System.out.println("\nGuardando AperturaMesa\n");
		AperturaMesaSrv.getInstancia().modificarAperturaMesa(apertMesa);
		System.out.println("\nAperturaMesa guardada\n");
		
	}

	/**
	 * 
	 */
	
	
	/**
	 * 
	 * @param area
	 * @return
	 * @throws RemoteException
	 */
	@Override
	public void liberarComandas(String[] idComandas) throws RemoteException
	{
		
		List<ComandaBean> comandas = new ArrayList<ComandaBean>();
		for (int i = 0; i < idComandas.length; i++) {
			ComandaBean comandaBean = ComandaSrv.getInstancia().obtenerComandasPorId(Integer.parseInt(idComandas[i]));
			comandas.add(comandaBean);
		}

		for  (ComandaBean comanda : comandas)
			{
				comanda.setEstado("TERMINADO");
				ComandaSrv.getInstancia().modificarComanda(comanda);
			}
	}

	/**
	 * 
	 */
	@Override
	public List<ComandaBean> obtenerComandasPorArea(String area) throws RemoteException
	{
		return ComandaSrv.getInstancia().obtenerComandasPorArea(area);
	}
	
	@Override
	public ComandaBean obtenerComandasPorId(Integer id) throws RemoteException
	{
		return ComandaSrv.getInstancia().obtenerComandasPorId(id);
	}



	@Override
	public ArrayList<MesaBean> obtenerMesasLibres() throws RemoteException {
		
			return MesaSrv.getInstancia().obtenerMesasLibres();
		}
	//miguel
	@Override
	public MesaBean obtenerMesa(Integer idMesa)throws RemoteException{
		MesaBean mesaBean = new MesaBean();
		mesaBean = Mesa.getInstancia().obtenerMesa(idMesa);
		return mesaBean;
	}
	
	@Override
	public Integer facturarMesa(AperturaMesaBean apertMesa, SucursalBean sucursal)
			throws RemoteException {
		
		FacturaBean factura = new FacturaBean();
		Float totalFactura = 0.0F;
		List<ItemCartaBean> itemsAux = new ArrayList<ItemCartaBean>();
		for (PedidoBean pedidoBean : apertMesa.getPedidos())
		{
			for (ItemCartaBean itemCarta : pedidoBean.getItems()) 
			{
				itemsAux.add(itemCarta);
				totalFactura = totalFactura + itemCarta.getPrecio();
			}
		}
		factura.setItemsCarta(itemsAux);
		factura.setTotal(totalFactura);
		factura.setEstado("ACTIVA");
		factura.setNroapmesa(apertMesa.getIdAperturaMesa());
		FacturaSrv.getInstancia().guardarFactura(factura);
		Integer idfact=FacturaSrv.getInstancia().obtenerUltimaFact("ACTIVA");
		apertMesa.setEstado("FACTURADA");
		AperturaMesaSrv.getInstancia().modificarAperturaMesa(apertMesa);
		return idfact;
	}



	@Override
	public void registrarPago(FacturaBean factura,SucursalBean sucursal, String formaPago)
			throws RemoteException {
			

			if ("EFECTIVO".equals(formaPago))
			{
				System.out.println("Get efectivo: "+sucursal.getCaja().getEfectivo());
				sucursal.getCaja().setEfectivo(sucursal.getCaja().getEfectivo()+factura.getTotal());
					
			} 
			else if ("CREDITO".equals(formaPago))
			{
				sucursal.getCaja().setTarjetaCredito(sucursal.getCaja().getTarjetaCredito()+factura.getTotal());
			} 
			else 
			{	sucursal.getCaja().setTarjetaDebito(sucursal.getCaja().getTarjetaDebito()+factura.getTotal());
			}
			
			CajaSrv.getInstancia().guardarCaja(sucursal.getCaja());	
			factura.setEstado("PAGADA");
			FacturaSrv.getInstancia().modificarFactura(factura);
			AperturaMesaBean apmesa=AperturaMesaSrv.getInstancia().obtenerAperturasPorId(factura.getNroapmesa());
			apmesa.setEstado("INACTIVA");
			AperturaMesaSrv.getInstancia().modificarAperturaMesa(apmesa);

	}

	public FacturaBean obtenerFactura(Integer id) throws RemoteException {
		
		return FacturaSrv.getInstancia().obtenerFactura(id);
	}



	@Override
	public FacturaBean obtenerFacturaPorApMesa(Integer id)
			throws RemoteException {
		
		return FacturaSrv.getInstancia().obtenerFacturaPorApMesa(id);
	}



	@Override
	public CajaBean obtenerCaja(SucursalBean sucursal) throws RemoteException {
		// TODO Auto-generated method stub
		return sucursal.getCaja();
	}
	
	/*
	 * PARA ELIMINAR
	 */
	
//	@Override
//	public List<AperturaMesaBean> obtenerAperturasPorMozo(Integer legajo)
//			throws RemoteException {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	@Override
//	public String[] validarCantidadComensales(List<MesaBean> mesas,
//			Integer cantComensales) throws RemoteException {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	@Override
//	public List<MozoBean> obtenerMozosPorSector(Integer idSector) throws RemoteException {
//
//		return null;
//	}
//
//	@Override
//	public SectorBean obtenerSectorPorMesa(MesaBean mesa)
//			throws RemoteException {
//		// TODO Auto-generated method stub
//		return null;
//	}	///////////////////////////
//
//	@Override
//	public Integer calcularComision(MozoBean mozo) throws RemoteException {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	@Override
//	public void modificarMesa(MesaBean mesa) throws RemoteException {
//		// TODO Auto-generated method stub
//		
//	}
//
//	@Override
//	public void reservarMesa(Integer cantComensales) throws RemoteException {
//		// TODO Auto-generated method stub
//		
//	}
//
//	@Override
//	public List<MesaBean> obtenerMesasLibres() throws RemoteException {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	@Override
//	public List<MozoBean> obtenerMozosPorSucursal(SucursalBean sucursal)
//			throws RemoteException {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	@Override
//	public SectorBean obtenerSector(Integer idSector) throws RemoteException {
//		// TODO Auto-generated method stub
//		return null;
//	}
//
//	@Override
//	public List<ItemCartaBean> obtenerItemsDePedido(MozoBean mozo,
//			AperturaMesaBean apertMesa) throws RemoteException {
//		// TODO Auto-generated method stub
//		return null;
//	}




	
}
	
	
	
	
	
